home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1082.dms / q1082.adf / src.lzh / Fig / arc.c < prev    next >
C/C++ Source or Header  |  1991-07-18  |  5KB  |  212 lines

  1. /* 
  2.  *    FIG : Facility for Interactive Generation of figures
  3.  *
  4.  *    Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU)
  5.  *    January 1985.
  6.  *    1st revision : Aug 1985.
  7.  *
  8.  *    %W%    %G%
  9. */
  10. #include "fig.h"
  11. #include "resources.h"
  12. #include "alloc.h"
  13. #include "func.h"
  14. #include "object.h"
  15. #include "paintop.h"
  16.  
  17. /*#define            PI        3.14159*/
  18.  
  19. extern int        foreground_color, background_color;
  20. extern int        fix_x, fix_y, cur_x, cur_y;
  21.  
  22. extern int        autoforwardarrow_mode, autobackwardarrow_mode;
  23. extern int        cur_line_style, line_thickness;
  24. extern float        cur_styleval;
  25. extern int        cur_color;
  26. extern float        cur_dashlength;
  27. extern int        num_point;
  28. extern int        DEBUG;
  29. extern F_compound    objects;
  30.  
  31. extern            freehand_elasticline();
  32. extern            (*canvas_kbd_proc)();
  33. extern            (*canvas_locmove_proc)();
  34. extern            (*canvas_leftbut_proc)();
  35. extern            (*canvas_middlebut_proc)();
  36. extern            (*canvas_rightbut_proc)();
  37. extern            null_proc();
  38. extern            set_popupmenu();
  39.  
  40. F_pos            point[3];
  41.  
  42.             create_arcobject();
  43.             get_arcpoint();
  44.             init_arc_drawing();
  45.  
  46. arc_drawing_selected()
  47. {
  48.     canvas_kbd_proc = null_proc;
  49.     canvas_locmove_proc = null_proc;
  50.     canvas_leftbut_proc = init_arc_drawing;
  51.     canvas_middlebut_proc = null_proc;
  52.     canvas_rightbut_proc = set_popupmenu;
  53.     set_cursor(&arrow_cursor);
  54.     reset_action_on();
  55.     }
  56.  
  57. init_arc_drawing(x, y)
  58. int    x, y;
  59. {
  60.     num_point = 0;
  61.     point[num_point].x = fix_x = cur_x = x;
  62.     point[num_point++].y = fix_y = cur_y = y;
  63.     canvas_locmove_proc = freehand_elasticline;    /* in line.c  */
  64.     canvas_leftbut_proc = get_arcpoint;
  65.     canvas_middlebut_proc = create_arcobject;
  66.     draw_elasticline();        /* in line.c  */
  67.     set_temp_cursor(&null_cursor);
  68.     set_action_on();
  69.     }
  70.  
  71. get_arcpoint(x, y)
  72. int    x, y;
  73. {
  74.     if (x == fix_x && y == fix_y) return;
  75.  
  76.     if (num_point == 2) create_arcobject(x, y);
  77.     draw_elasticline();        /* in line.c  */
  78.     cur_x = x;  cur_y = y;
  79.     draw_elasticline();        /* in line.c  */
  80.     point[num_point].x = fix_x = x;
  81.     point[num_point++].y = fix_y = y;
  82.     draw_elasticline();        /* in line.c  */
  83.     }
  84.  
  85. create_arcobject(lx, ly)
  86. int    lx, ly;
  87. {
  88.     extern F_arrow    *forward_arrow(), *backward_arrow();
  89.     F_arc        *arc;
  90.     int        x, y, i;
  91.     float        xx, yy;
  92.  
  93.     draw_elasticline();
  94.     cur_x = lx;  cur_y = ly;
  95.     draw_elasticline();        /* in line.c  */
  96.     if (num_point == 1) {
  97.         arc_drawing_selected();
  98.         return;
  99.         }
  100.     else if (num_point == 2) {
  101.         point[num_point].x = lx;
  102.         point[num_point++].y = ly;
  103.         }
  104.  
  105.     x = point[0].x;  y = point[0].y;
  106.     for (i = 1; i < num_point; i++) {
  107.         pw_vector(canvas_pixwin, x, y, point[i].x, point[i].y, INV_PAINT,
  108.             1);
  109.         x = point[i].x;  y = point[i].y;
  110.         }
  111.     if (num_point < 3) {
  112.         arc_drawing_selected();
  113.         return;
  114.         }
  115.     if (! compute_arccenter(point[0], point[1], point[2], &xx, &yy)) {
  116.         arc_drawing_selected();
  117.         return;
  118.         }
  119.     Arc_malloc(arc);
  120.     if (arc == NULL) {
  121.         blink_msg();
  122.         put_msg(Err_mem);
  123.         arc_drawing_selected();
  124.         return;
  125.         }
  126.     arc->type = T_3_POINTS_ARC;
  127.     arc->style = cur_line_style;
  128.     arc->thickness = line_thickness;
  129.     arc->style_val = cur_styleval;
  130.     arc->pen = NULL;
  131.     arc->area_fill = NULL;
  132.     arc->color = cur_color;
  133.     arc->depth = 0;
  134.     arc->direction = compute_direction(point[0], point[1], point[2]);
  135.     if (autoforwardarrow_mode)
  136.         arc->for_arrow = forward_arrow();
  137.     else
  138.         arc->for_arrow = NULL;
  139.     if (autobackwardarrow_mode)
  140.         arc->back_arrow = backward_arrow();
  141.     else
  142.         arc->back_arrow = NULL;
  143.     arc->center.x = xx;
  144.     arc->center.y = yy;
  145.     arc->point[0].x = point[0].x;
  146.     arc->point[0].y = point[0].y;
  147.     arc->point[1].x = point[1].x;
  148.     arc->point[1].y = point[1].y;
  149.     arc->point[2].x = point[2].x;
  150.     arc->point[2].y = point[2].y;
  151.     arc->next = NULL;
  152.     pw_batch_on(canvas_pixwin);
  153.     draw_arc(arc, foreground_color);
  154.     if (DEBUG) {
  155.         int        xmin, ymin, xmax, ymax;
  156.         arc_bound(arc, &xmin, &ymin, &xmax, &ymax);
  157.         draw_rectbox(xmin, ymin, xmax, ymax, PAINT);
  158.         }
  159.     pw_batch_off(canvas_pixwin);
  160.     clean_up();
  161.     set_action_object(F_CREATE, O_ARC);
  162.     insert_arc(&objects.arcs, arc);
  163.     set_latestarc(arc);
  164.     set_modifiedflag();
  165.     arc_drawing_selected();
  166.     }
  167.  
  168. #define             round(x)    ((int)((x) + .5))
  169.  
  170. draw_arc(a, op)
  171. F_arc    *a;
  172. int    op;
  173. {
  174.     extern int    foreground_color, background_color;
  175.  
  176.     curve(round(a->point[0].x - a->center.x),
  177.         round(a->center.y - a->point[0].y),
  178.         round(a->point[2].x - a->center.x),
  179.         round(a->center.y - a->point[2].y),
  180.         a->direction, 1, 1,
  181.         round(a->center.x), round(a->center.y), op);
  182.     draw_arcarrow(a, op);
  183.     }
  184.  
  185. draw_arcarrow(a, op)
  186. F_arc    *a;
  187. int    op;
  188. {
  189.     int    x, y;
  190.  
  191.     if (a->for_arrow) {
  192.         compute_normal(a->center.x, a->center.y, a->point[2].x, 
  193.             a->point[2].y, a->direction, &x, &y);
  194.         if (op == foreground_color)
  195.         draw_arrow(x, y, a->point[2].x, a->point[2].y,
  196.                 a->for_arrow, PAINT);
  197.         else
  198.         draw_arrow(x, y, a->point[2].x, a->point[2].y,
  199.                 a->for_arrow, ERASE);
  200.         }
  201.     if (a->back_arrow) {
  202.         compute_normal(a->center.x, a->center.y, a->point[0].x, 
  203.             a->point[0].y, a->direction ^ 1, &x, &y);
  204.         if (op == foreground_color)
  205.         draw_arrow(x, y, a->point[0].x, a->point[0].y,
  206.                 a->back_arrow, PAINT);
  207.         else
  208.         draw_arrow(x, y, a->point[0].x, a->point[0].y,
  209.                 a->back_arrow, ERASE);
  210.         }
  211.     }
  212.